Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / community_interfaces_directory.py

Displaying Raw • Download


meshchatx/src/backend/community_interfaces_directory.py df60c6551d6286240cc9dab37896f3364b5e16f6 (df60c655) Text, 7.26 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Convert directory.rns.recipes listing rows into MeshChat interface preset dicts."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787json
Tff7b72import T7ee787re
Tff7b72import T7ee787urllibT7ee787.T7ee787error
Tff7b72import T7ee787urllibT7ee787.T7ee787request
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any
Tff7b72from T7ee787urllibT7ee787.T7ee787parse Tff7b72import Te6edf3urlparse

Te6edf3DEFAULT_SUBMITTED_URL Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffhttps://directory.rns.recipes/api/directory/submitted?search=&type=&status=onlineTa5d6ff"
Tb4b4b4)

Te6edf3DESCRIPTION Tff7b72= Ta5d6ff"Ta5d6ffdirectory.rns.recipes (user-submitted, online)Ta5d6ff"

Te6edf3_ALLOWED_DIRECTORY_HOSTS Tff7b72= Tffa657frozensetTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffdirectory.rns.recipesTa5d6ff"Tb4b4b4}Tb4b4b4)


Tff7b72def Td2a8ffvalidate_directory_fetch_urlTb4b4b4(Te6edf3urlTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Reject SSRF: only https to directory.rns.recipes, no credentials."""
Tff7b72if Tff7b72not Te6edf3url Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3urlTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffURL must be a non-empty stringTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3parsed Tff7b72= Te6edf3urlparseTb4b4b4(Te6edf3urlTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3parsedTff7b72.Td2a8ffscheme Tff7b72!= Ta5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffCommunity directory URL must use httpsTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3netloc Tff7b72= Te6edf3parsedTff7b72.Td2a8ffnetloc Tff7b72or Ta5d6ff"Ta5d6ff"
Tff7b72if Ta5d6ff"Ta5d6ff@Ta5d6ff" Tff7b72in Te6edf3netlocTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffCommunity directory URL must not contain credentialsTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3host Tff7b72= Tb4b4b4(Te6edf3parsedTff7b72.Td2a8ffhostname Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3host Tff7b72not Tff7b72in Te6edf3_ALLOWED_DIRECTORY_HOSTSTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffCommunity directory URL host is not allowedTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return Te6edf3urlTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)


Tff7b72class T56d364_DirectoryFetchNoRedirectHandlerTb4b4b4(Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffHTTPRedirectHandlerTb4b4b4)Tb4b4b4:
T8b949e"""urllib follows redirects by default; blocked to prevent SSRF via Location."""

Tff7b72def Td2a8ffredirect_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3reqTb4b4b4, Te6edf3fpTb4b4b4, Te6edf3codeTb4b4b4, Te6edf3msgTb4b4b4, Te6edf3headersTb4b4b4, Te6edf3newurlTb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3urllibTff7b72.Td2a8fferrorTff7b72.Td2a8ffHTTPErrorTb4b4b4(
Te6edf3reqTff7b72.Td2a8fffull_urlTb4b4b4,
Te6edf3codeTb4b4b4,
Ta5d6ff"Ta5d6ffRedirects are not followed for community directory fetchTa5d6ff"Tb4b4b4,
Te6edf3headersTb4b4b4,
Te6edf3fpTb4b4b4,
Tb4b4b4)


Te6edf3_DIRECTORY_FETCH_OPENER Tff7b72= Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffbuild_openerTb4b4b4(
Te6edf3_DirectoryFetchNoRedirectHandlerTb4b4b4(Tb4b4b4)
Tb4b4b4)


Tff7b72def Td2a8fffetch_directory_payloadTb4b4b4(Te6edf3urlTb4b4b4: Tffa657strTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff60.0Tb4b4b4) Tff7b72-Tff7b72> Tffa657objectTb4b4b4:
Te6edf3req Tff7b72= Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffRequestTb4b4b4(
Te6edf3urlTb4b4b4,
Te6edf3headersTff7b72=Tb4b4b4{
Ta5d6ff"Ta5d6ffAcceptTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffapplication/jsonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUser-AgentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMeshChatX-community-interfaces/1.0 (+https://meshchatx.com/)Ta5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3methodTff7b72=Ta5d6ff"Ta5d6ffGETTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72with Te6edf3_DIRECTORY_FETCH_OPENERTff7b72.Td2a8ffopenTb4b4b4(Te6edf3reqTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4) Tff7b72as Te6edf3respTb4b4b4:
Tff7b72return Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3respTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffbuild_interfaces_from_directory_urlTb4b4b4(
Te6edf3urlTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff60.0Tb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3url Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657strTb4b4b4(Te6edf3urlTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3resolved Tff7b72= Te6edf3validate_directory_fetch_urlTb4b4b4(Te6edf3urlTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3resolved Tff7b72= Te6edf3DEFAULT_SUBMITTED_URL
Te6edf3payload Tff7b72= Te6edf3fetch_directory_payloadTb4b4b4(Te6edf3resolvedTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4)
Te6edf3rows Tff7b72= Te6edf3rows_from_payloadTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72return Te6edf3transform_directory_rowsTb4b4b4(Te6edf3rowsTb4b4b4)Tb4b4b4, Te6edf3resolved


Te6edf3_RE_REMOTE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff^Ta5d6ff\Ta5d6ffs*remoteTa5d6ff\Ta5d6ffs*=Ta5d6ff\Ta5d6ffs*(Ta5d6ff\Ta5d6ffS+)Ta5d6ff"Tb4b4b4, Te6edf3reTff7b72.Td2a8ffMULTILINE Tff7b72| Te6edf3reTff7b72.Td2a8ffIGNORECASETb4b4b4)
Te6edf3_RE_TARGET_HOST Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(
Ta5d6ffrTa5d6ff"Ta5d6ff^Ta5d6ff\Ta5d6ffs*target_hostTa5d6ff\Ta5d6ffs*=Ta5d6ff\Ta5d6ffs*(Ta5d6ff\Ta5d6ffS+)Ta5d6ff"Tb4b4b4,
Te6edf3reTff7b72.Td2a8ffMULTILINE Tff7b72| Te6edf3reTff7b72.Td2a8ffIGNORECASETb4b4b4,
Tb4b4b4)
Te6edf3_RE_TRANSPORT_IDENTITY Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(
Ta5d6ffrTa5d6ff"Ta5d6ff^Ta5d6ff\Ta5d6ffs*transport_identityTa5d6ff\Ta5d6ffs*=Ta5d6ff\Ta5d6ffs*(Ta5d6ff\Ta5d6ffS+)Ta5d6ff"Tb4b4b4,
Te6edf3reTff7b72.Td2a8ffMULTILINE Tff7b72| Te6edf3reTff7b72.Td2a8ffIGNORECASETb4b4b4,
Tb4b4b4)
Te6edf3_RE_PEERS_LINE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff^Ta5d6ff\Ta5d6ffs*peersTa5d6ff\Ta5d6ffs*=Ta5d6ff\Ta5d6ffs*(.+)$Ta5d6ff"Tb4b4b4, Te6edf3reTff7b72.Td2a8ffMULTILINE Tff7b72| Te6edf3reTff7b72.Td2a8ffIGNORECASETb4b4b4)


Tff7b72def Td2a8ffrows_from_payloadTb4b4b4(Te6edf3payloadTb4b4b4: Tffa657objectTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3payloadTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3data
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3payload
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffExpected list or object with Ta5d6ff'Ta5d6ffdataTa5d6ff'Ta5d6ff arrayTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8ff_parse_config_valueTb4b4b4(Te6edf3patternTb4b4b4: Te6edf3reTff7b72.Td2a8ffPatternTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4, Te6edf3cfgTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3m Tff7b72= Te6edf3patternTff7b72.Td2a8ffsearchTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72if Tff7b72not Te6edf3mTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff"
Tff7b72return Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff'Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8ff_first_peer_from_configTb4b4b4(Te6edf3cfgTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3raw Tff7b72= Te6edf3_parse_config_valueTb4b4b4(Te6edf3_RE_PEERS_LINETb4b4b4, Te6edf3cfgTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rawTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3part Tff7b72in Te6edf3rawTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3p Tff7b72= Te6edf3partTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff'Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3pTb4b4b4:
Tff7b72return Te6edf3p
Tff7b72return Ta5d6ff"Ta5d6ff"


Tff7b72def Td2a8ff_tcp_host_from_rowTb4b4b4(Te6edf3rowTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Te6edf3cfgTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3h Tff7b72= Tb4b4b4(Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffhostTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffaddressTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3hTb4b4b4:
Tff7b72return Te6edf3h
Tff7b72return Te6edf3_parse_config_valueTb4b4b4(Te6edf3_RE_REMOTETb4b4b4, Te6edf3cfgTb4b4b4) Tff7b72or Te6edf3_parse_config_valueTb4b4b4(
Te6edf3_RE_TARGET_HOSTTb4b4b4,
Te6edf3cfgTb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8ff_i2p_peerTb4b4b4(Te6edf3rowTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Te6edf3cfgTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3h Tff7b72= Tb4b4b4(Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffhostTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffaddressTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3hTb4b4b4:
Tff7b72return Te6edf3h
Tff7b72return Te6edf3_first_peer_from_configTb4b4b4(Te6edf3cfgTb4b4b4)


Tff7b72def Td2a8ff_transport_idTb4b4b4(Te6edf3rowTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Te6edf3cfgTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3tid Tff7b72= Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftransportIdTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3tid Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657strTb4b4b4(Te6edf3tidTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3tidTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3_parse_config_valueTb4b4b4(Te6edf3_RE_TRANSPORT_IDENTITYTb4b4b4, Te6edf3cfgTb4b4b4)


Tff7b72def Td2a8fftransform_directory_rowsTb4b4b4(Te6edf3rowsTb4b4b4: Tffa657listTb4b4b4[Te6edf3AnyTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3out_listTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3rowsTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3out_list

Tff7b72for Te6edf3row Tff7b72in Te6edf3rowsTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3rowTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72continue

Te6edf3name Tff7b72= Tb4b4b4(Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Te6edf3rtype Tff7b72= Tb4b4b4(Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3type_name Tff7b72= Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftypeNameTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3type_nameTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3type_name Tff7b72= Tffa657strTb4b4b4(Te6edf3type_nameTb4b4b4)
Te6edf3cfg Tff7b72= Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3cfgTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Ta5d6ff"Ta5d6ff"

Tff7b72if Te6edf3rtype Tff7b72== Ta5d6ff"Ta5d6ffrnodeTa5d6ff"Tb4b4b4:
Tff7b72continue

Tff7b72if Te6edf3rtype Tff7b72== Ta5d6ff"Ta5d6ffi2pTa5d6ff"Tb4b4b4:
Te6edf3addr Tff7b72= Te6edf3_i2p_peerTb4b4b4(Te6edf3rowTb4b4b4, Te6edf3cfgTb4b4b4)
Tff7b72if Tff7b72not Te6edf3addrTb4b4b4:
Tff7b72continue
Te6edf3out_listTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3name Tff7b72or Te6edf3addrTb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffi2p_peersTa5d6ff"Tb4b4b4: Tb4b4b4[Te6edf3addrTb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Te6edf3DESCRIPTIONTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72continue

Te6edf3port Tff7b72= Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3port Tff7b72is Tff7b72None Tff7b72or Te6edf3port Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3port_i Tff7b72= Tffa657intTb4b4b4(Te6edf3portTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72continue

Te6edf3addr Tff7b72= Te6edf3_tcp_host_from_rowTb4b4b4(Te6edf3rowTb4b4b4, Te6edf3cfgTb4b4b4)
Tff7b72if Tff7b72not Te6edf3addrTb4b4b4:
Tff7b72continue

Te6edf3tid Tff7b72= Te6edf3_transport_idTb4b4b4(Te6edf3rowTb4b4b4, Te6edf3cfgTb4b4b4)
Te6edf3backbone_in_type Tff7b72= Te6edf3rtype Tff7b72== Ta5d6ff"Ta5d6ffbackboneTa5d6ff" Tff7b72or Te6edf3type_name Tff7b72== Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"
Te6edf3backbone_in_tcp Tff7b72= Te6edf3rtype Tff7b72== Ta5d6ff"Ta5d6fftcpTa5d6ff" Tff7b72and Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff" Tff7b72in Te6edf3cfg
Te6edf3is_backboneish Tff7b72= Te6edf3backbone_in_type Tff7b72or Te6edf3backbone_in_tcp
Te6edf3is_tcp_style Tff7b72= Te6edf3rtype Tff7b72== Ta5d6ff"Ta5d6fftcpTa5d6ff" Tff7b72or Te6edf3type_name Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"

Tff7b72if Te6edf3is_backboneish Tff7b72and Te6edf3tidTb4b4b4:
Te6edf3out_listTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4: Te6edf3addrTb4b4b4,
Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Te6edf3port_iTb4b4b4,
Ta5d6ff"Ta5d6fftransport_identityTa5d6ff"Tb4b4b4: Te6edf3tidTb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Te6edf3DESCRIPTIONTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72continue

Tff7b72if Te6edf3is_backboneish Tff7b72and Tff7b72not Te6edf3tidTb4b4b4:
Te6edf3out_listTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4: Te6edf3addrTb4b4b4,
Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Te6edf3port_iTb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Te6edf3DESCRIPTIONTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72continue

Tff7b72if Te6edf3is_tcp_styleTb4b4b4:
Te6edf3out_listTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4: Te6edf3addrTb4b4b4,
Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Te6edf3port_iTb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Te6edf3DESCRIPTIONTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Tff7b72return Te6edf3out_list


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────